(HSP3) sample [Omake].hsp

sample\hspdsc\(HSP3) sample [Omake].hsp » Plain Format

/*********************************************************************
 (おまけ)DirectShow を直接 HSP で取扱ってみるサンプル
  DirectShow経由でメディアファイルを開きます。

  MCIを使ったほうが断然早いような気が…。
  でも、対応したデコーダとスプリッタがあれば、FLVだろうとMP4だろうと
  取扱えるので便利かもしれない。
*********************************************************************/

#define CLSID_FilterGraph 		"{e436ebb3-524f-11ce-9f53-0020af0ba770}"
#define IID_GraphBuilder 		"{56a868a9-0ad4-11ce-b03a-0020af0ba770}"
#define IID_MediaControl 		"{56a868b1-0ad4-11ce-b03a-0020af0ba770}"
#define IID_MediaPosition 		"{56a868b2-0ad4-11ce-b03a-0020af0ba770}"
#define IID_MediaSeeking 		"{36b73880-c2c8-11cf-8b46-00805f6cef60}"
#define IID_VideoWindow			"{56a868b4-0ad4-11ce-b03a-0020af0ba770}"
#define IID_BasicVideo			"{56a868b5-0ad4-11ce-b03a-0020af0ba770}"
#define WS_CHILD				0x40000000
#define WS_CLIPSIBLINGS			0x04000000
#define WM_APP 					0x8000
#define WM_GRAPH_NOTIFY  		WM_APP + 1
#usecom IGraphBuilder	IID_GraphBuilder 	CLSID_FilterGraph
#usecom IMediaControl 	IID_MediaControl 	CLSID_FilterGraph
#usecom IMediaPosition 	IID_MediaPosition 	CLSID_FilterGraph
#usecom IMediaSeeking 	IID_MediaSeeking 	CLSID_FilterGraph
#usecom IVideoWindow 	IID_VideoWindow 	CLSID_FilterGraph
#usecom IBasicVideo 	IID_BasicVideo 		CLSID_FilterGraph

	// COMの初期化
	newcom pGraphBuilder, IGraphBuilder
	// COMのQueryInterface呼び出し
	querycom pMediaControl, pGraphBuilder, IMediaControl
	querycom pMediaSeeking, pGraphBuilder, IMediaSeeking
	querycom pMediaPosition, pGraphBuilder, IMediaPosition
	querycom pVideoWindow, pGraphBuilder, IVideoWindow
	querycom pBasicVideo, pGraphBuilder, IBasicVideo
	
	onerror gosub *error : onerror 0	; COMエラー回避用
	onexit *exit
	
	dialog "*", 16
	if stat == 0 : end
	
	pMediaControl->"RenderFile" refstr
	if stat != 0 : dialog "レンダラ失敗", 1 : gosub *exit
	
	// ビデオ レンダラが接続されていない場合、
	// IVideoWindowインターフェイスのメソッドはすべてエラー コード VFW_E_NOT_CONNECTED を返す。
	// そのためか、HSP側でエラーが発生し終了してしまうのでonerrorで一時的に回避。
	;mes varuse(pVideoWindow)
	onerror 1	; エラー回避
	
	pVideoWindow("WindowStyle") = WS_CHILD | WS_CLIPSIBLINGS
	pVideoWindow("Owner") = hwnd
	pVideoWindow->"SetWindowPosition" 0, 0, 640, 480
	
	onerror 0	; エラー回避終了
	pMediaPosition("Rate") = 1.3f	; 再生速度が指定可能
	pMediaControl->"Run"
	
	val = pMediaPosition("StopTime")	; トータル時間を取得
	repeat	; 再生時リピート
		val2 = pMediaPosition("CurrentPosition")	; 現在の時間を取得
		title ""+strf("%4.1f秒", val2)
		if val2 == val : pMediaPosition("CurrentPosition") = 0 : pMediaControl->"Run" 
		wait 12
	loop
stop
*exit
	pMediaControl->"Stop"
	delcom pBasicVideo
	delcom pVideoWindow
	delcom pMediaSeeking
	delcom pMediaPosition
	delcom pMediaControl
	delcom pGraphBuilder
end
*error
return